类的构建
类的基本构建
1
2
3class 类名(父类名):
“类描述,文档字符串 可选”
语句块类定义不限位置,可以包含在分支或其他从属语句块中,执行时存在即可。
类名:可以是任何有效标识符,建议采用大写单词的组合。如ClassName
类描述:在类定义后首行,以独立字符串形式定义。定义后通过<类名>.__doc__属性来访问
定义好的类在解释器读取完代码后自动生成一个类对象,每个类唯一对应一个类对象,用于存储这个类的基本信息。类对象是type类的实例,表达为type类型。
类对象内直接包含的语句会被执行,因此一般不在类定义中直接包含语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 一个极度简单的类
class Person(object):
"this is a class for person"
print('我是类中直接定义的print语句')
print(Person.__doc__)
print(type(Person))
d = Person()
print(type(d))
'''输出结果
我是类中直接定义的print语句
this is a class for person
<class 'type'>
<class '__main__.Person'>
'''类的属性和方法
属性和方法是类对外交互所提供的两种接口方式
属性:类中定义的变量,用来描述类的一些特性参数。分为类属性和实例属性。
类属性是类对象的属性,由所有实例对象所共享。类名.类属性 或 对象名.类属性
实例属性是实例对象的属性,由各实例对象独享。对象名.实例属性
1
2
3
4
5
6
7# 基本模式
class 类名(父类名):
类属性名 = 类属性初值
def 方法名(self,参数):
语句块
self.实例属性名 = 实例属性处置
语句块1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23# 简单实例
class Person(object):
count = 0
def add(self, name):
# 新建实例对象时count自增这个需求更适合在构造方法中实现,这里只是举例说明实例属性和类属性
self.name = name
print('添加一人', self.name)
Person.count += 1
p1 = Person()
p1.add('老王')
print('当前人数:',Person.count)
p2 = Person()
p2.add('老张')
print('当前人数:',Person.count)
'''输出结果
添加一人 老王
当前人数: 1
添加一人 老张
当前人数: 2
'''self是python面向对象中约定的一个类参数,代表类的实例。在类内部,self用于组合访问实例相关的属性和方法。
相比,类名代表类对象本身
方法:类内部定义的函数,用来给出类的操作功能。分为5种:
- 类方法:类对象的方法,由类对象或实例对象调用,只能操作类对象和其他方法,不能操作实例属性和实例方法。
- 实例方法:实例对象的方法,由实例对象调用,最常用。
- 自由方法:类中的一个普通函数,只能由类对象调用
- 静态方法:类中的一个普通函数,可以由类对象或实例对象调用
- 保留方法/魔法方法:方法名由双下划线开始和结束,用以实现python语言预定的功能,如__len__()。可以看作规定了名字的实例方法。通过重写保留方法,可以使类符合某种约定的特性
- 属性方法:对外表现为属性,对内表现为方法。可以用来约束对有特殊要求的属性的赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48# 基本模式
class 类名(父类名):
def 实例方法(self, 参数列表):
语句块
def 类方法(cls, 参数列表):
# cls必须是第一个参数,表示类对象本身
# classmethod是装饰器,必须写
# 不能使用实例方法和实例属性
语句块
def 自由方法(参数列表):
# 不需要self或cls
# 只能操作类属性和类方法
语句块
def 静态方法(参数列表):
# 不需要self或cls
# @staticmethod是装饰器,必须写
# 不能操作实例属性和实例方法
语句块
def 保留方法(self, 参数列表):
语句块
def 属性方法(self):
return self.实例变量名
@属性方法.setter
def 属性方法(self, value):
语句块
对象名 = 类名(参数)
对象名.实例方法(参数列表)
类名.类方法(参数列表)
对象名.类方法(参数列表)
类名.自由方法(参数列表)
类名.静态方法(参数列表)
对象名.静态方法(参数列表)
对象名.保留方法(参数列表)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68# 关于类中不同类型方法的示例代码
class Person(object):
count = 0
def __init__(self, name):
# 这是一个保留方法
self.name = name
Person.count += 1
def get_name(self):
# 这是一个实例方法
return self.name
def how_many(cls):
# 这是一个类方法
print('现在有%d个Person对象'%Person.count)
Person.count *= 10
print('十倍后是:%d个Person对象'%Person.count)
def say_hi():
# 这是一个自由方法
print('%d个Person向你说hi'%Person.count)
def stk_say_hi():
# 这是一个静态方法
print('%d个Person向你说hi'%Person.count)
def __len__(self):
# 这是一个保留方法
return len(self.name)
p1 = Person('老王')
p2 = Person('老张')
# 调用实例方法
print(p1.get_name())
print(p2.get_name())
# 调用类方法
p1.how_many()
Person.how_many()
# 调用自由方法
Person.say_hi()
# 调用静态方法
Person.stk_say_hi()
p2.stk_say_hi()
# 调用保留方法
print(len(p1))
'''输出结果
老王
老张
现在有2个Person对象
十倍后是:20个Person对象
现在有20个Person对象
十倍后是:200个Person对象
200个Person向你说hi
200个Person向你说hi
200个Person向你说hi
2
'''
类的构造方法(使用频率最高的保留方法)
用于从类创建实例对象的过程
为实例对象创建提供了参数输入方式
为实例属性的定义和赋值提供了支持
1
2
3
4# python使用预定义的__init__()作为构造方法
class 类名(父类名):
def __init__(self, 参数列表):
语句块构造方法的第一个参数约定是self,表示正在构造的实例对象自身,其他参数是实例参数
构造函数没有返回值,或返回None,否则产生TypeError异常。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 简单例子
class Person(object):
count = 0
def __init__(self, name):
self.name = name
print('正在创建一个Person类的对象,这个人的名字是',self.name)
Person.count += 1
print('当前已经创建了%d个Person对象'%Person.count)
p1 = Person('老王')
p2 = Person('哪吒')
'''输出结果
正在创建一个Person类的对象,这个人的名字是 老王
当前已经创建了1个Person对象
正在创建一个Person类的对象,这个人的名字是 哪吒
当前已经创建了2个Person对象
'''类的析构方法(保留方法,一般不需要编写)
在真实删除实例对象时被调用,而不一定是调用del关键字时,del只是删除该对象名对内存中对象的一个引用。
真实删除:当前对象的引用数为0 或 当期程序退出(垃圾回收)
1
2
3
4# python使用预定义的__del__()作为析构方法
class 类名(父类):
def __del__(self):
语句块1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class Person(object):
def __init__(self, name):
self.name = name
def __del__(self):
print('bye', self.name)
p1 = Person('老王')
p2 = p1
del p1
print('xxxxx')
del p2
'''输出结果
xxxxx
bye 老王
'''
类的使用
创建实例对象使用类的功能
对象名 = 类名(参数)
对象名.属性名
对象名.方法名(参数)
直接使用类对象使用类的功能
对象的识别
python对象的三要素:标识、类型、值
- 标识identity:对象一旦构建不会改变,用id获得,一般是内存地址
- 类型type:对象的类型,用type()获得
- 值value:分为可变mutable与不可变immutable两种
函数/保留字 | 描述 |
---|---|
id(x) | 返回x的标识,cpython用内存地址表示 |
x is y | 判断x和y的标识是否相等,返回True/False,不判断值 |